/**
 * <h3>SuggestionMapper</h3>
 * <p> 接口名：SuggestionMapper</p>
 *
 * <h3>功能描述</h3>
 * <p> 建议信息的数据访问层接口，定义了对建议表的增删改查操作方法。</p>
 * <p> 该接口继承自 MyBatis Plus 的 BaseMapper，扩展了基于业务需求的自定义查询方法。</p>
 *
 * <h3>元数据</h3>
 * <ul>
 *    <li> 作者：郭强 </li>
 *    <li> 创建日期：2025年05月22日 21:22:53 </li>
 * </ul>
 *
 * <h3>其他信息</h3>
 * <ul>
 *    <li> 示例代码：{@code @Autowired private SuggestionMapper suggestionMapper;}</li>
 * </ul>
 *
 * @implSpec 实现了 MyBatis Plus 的 {@link BaseMapper} 接口，并扩展了建议相关的业务方法。
 * @since 1.0.0
 */
package com.dnndo.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dnndo.system.domain.Suggestion;
import com.dnndo.system.domain.dto.SuggestionDTO;
import com.dnndo.system.domain.vo.SuggestionVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 建议数据访问层接口
 */
public interface SuggestionMapper extends BaseMapper<SuggestionDTO> {
    // 新增学校管理员查询方法
    List<Suggestion> selectSuggestionListBySchool(SuggestionDTO dto);

    // 新增普通用户查询方法
    List<Suggestion> selectSuggestionListByCommon(SuggestionDTO dto);

    /**
     * 查询所有或符合条件的建议列表
     * @param dto 封装查询条件的 Suggestion 对象
     * @return List<SuggestionVO> 符合条件的建议信息列表
     * @see SuggestionVO
     */
    List<Suggestion> selectSuggestionList(SuggestionDTO dto);

    /**
     * 根据建议ID查询建议详细信息
     * @param suggestionId 建议唯一标识符
     * @return SuggestionVO 建议实体对象
     * @see Suggestion
     */
    SuggestionDTO selectSuggestionListById(Long suggestionId);

    /**
     * 根据建议ID更新建议信息
     * @param suggestion 封装更新数据的 Suggestion 对象
     * @return int 受影响的记录数（通常为1）
     * @see SuggestionDTO
     */
    int updateSuggestionById(SuggestionDTO suggestion);

    /**
     * 根据建议ID和用户ID更新建议信息
     * @param suggestion 封装更新数据的 Suggestion 对象
     * @return int 受影响的记录数
     */
    int updateSuggestionByIdWithUser(SuggestionDTO suggestion);

    /**
     * 新增一条建议记录
     * @param suggestion 封装新增数据的 Suggestion 对象
     * @return int 受影响的记录数（通常为1）
     * @see SuggestionDTO
     */
    int insertSuggestion(SuggestionDTO suggestion);

    /**
     * 根据建议ID删除建议记录
     * @param suggestionId 建议唯一标识符
     * @return int 受受影响的记录数（通常为1）
     * @see SuggestionDTO
     */
    int deleteSuggestionById(Integer suggestionId);

    /**
     * 获取用户自己的投诉建议
     * @return SuggestionDTO
     */
    List<SuggestionDTO> selectMySuggestionList(@Param("userId") Long userId);
}
